package org.jumiz.javafx.client.pages.commonents;

import com.alibaba.fastjson2.JSON;

import javax.swing.table.DefaultTableModel;
import java.sql.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

public class ExtendMap<K, V, E> {

    private DefaultTableModel cache = new DefaultTableModel(null, new Object[]{"key", "value", "extend"});

    private ReentrantLock reentrantLock = new ReentrantLock();

    public ExtendMap() {

    }

    public void putObject(K k, V v, E e) {
        reentrantLock.lock();
        try {
            int rowAt = getRowAt(k);
            if (rowAt > -1) {
                cache.setValueAt(v, rowAt, 1);
                cache.setValueAt(e, rowAt, 2);
            } else {
                cache.addRow(new Object[]{k, v, e});
            }
        } finally {
            reentrantLock.unlock();
        }
    }

    private int getRowAt(K k) {
        for (int i = 0; i < cache.getRowCount(); i++) {
            if (cache.getValueAt(i, 0).equals(k)) {
                return i;
            }
        }
        return -1;
    }

    public V getObjectValue(K k) {
        for (int i = 0; i < cache.getRowCount(); i++) {
            if (cache.getValueAt(i, 0).equals(k)) {
                return (V)cache.getValueAt(i, 1);
            }
        }
        return null;
    }

    public E getObjectExtend(K k) {
        for (int i = 0; i < cache.getRowCount(); i++) {
            if (cache.getValueAt(i, 0).equals(k)) {
                return (E)cache.getValueAt(i, 2);
            }
        }
        return null;
    }

    public void removeKey(K k) {
        for (int i = 0; i < cache.getRowCount(); i++) {
            if (cache.getValueAt(i, 0).equals(k)) {
                cache.removeRow(i);
                break;
            }
        }
    }

//    public List<V> getValues() {
//        ArrayList<V> values = new ArrayList<>(cache.getRowCount());
//        for (int i = 0; i < cache.getRowCount(); i++) {
//            values.add((V)cache.getValueAt(i, 1));
//        }
//        return values;
//    }

    public Map<K, V> valueToMap() {
        HashMap<K, V> map = new HashMap<>();
        for (int i = 0; i < cache.getRowCount(); i++) {
            map.put((K) cache.getValueAt(i, 0), (V) cache.getValueAt(i, 1));
        }
        return map;
    }

}
